#ifndef VECTOR_BINARIO_H
#define VECTOR_BINARIO_H

#include <stdbool.h>
#include <stdio.h>

/* ******************************************************************
 *                DEFINICION DE LOS TIPOS DE DATOS					*
 * *****************************************************************/

/* IMPORTANTE: La inclusión del término "vector" dentro de su nombre
 * es un abuso del lenguaje ya que esta estructura no vendría a representar
 * más que un número binario al cual sólo se le puede agregar un bit
 * al final por operación y no se puede borrar ninguno ya escrito. */
typedef struct _vector_bin vector_binario_t;

/* ******************************************************************
 *                 PRIMITIVAS DEL VECTOR BINARIO					*
 * *****************************************************************/

/* Crea y devuelve un vector binario vacío de tamaño largo2. */
vector_binario_t* v_binario_crear (int largo2);

/* Almacena el bit al final del vector.
 * Pre: el vector fue creado.
 * Devuelve false en caso de error y true si el bit fue guardado con éxito. */
bool v_binario_agregar (vector_binario_t* vec, bool bit);

/* Devuelve el bit guardado en la posición 'pos' del vector.
 * Devuelve -1 si la posición es inválida.
 * Pre: el vector fue creado.
 * Post: el bit fue devuelto. */
int v_binario_obtener (vector_binario_t* vec, size_t pos);

/* Devuelve la cantidad de bits que posee el vector binario.
 * Pre: el vector fue creado. */
int v_binario_largo (vector_binario_t* vec);

/* Invierte el orden de los bits almacenados.
 * Pre: el vector fue creado.
 * Post: el orden de los bits fue invertido. */
void v_binario_invertir (vector_binario_t* vec);

/* Imprime al vector binario por pantalla.
 * Nota: Puede servir para pruebas MUY caseras. Lo ideal sería ir
 * obteniendo cada bit posición a posición, comparando cada uno de ellos
 * con los datos de prueba y emitir un booleano como resultado */
void v_binario_imprimir (vector_binario_t* vec);

/* Primitiva en desuso por el momento */
void v_binario_escribir (vector_binario_t* vec, FILE* archivo);

/* Destruye el vector binario.
 * Pre: el vector binario es válido.
 * Post: se eliminó al vector binario y todos sus elementos. */
void v_binario_destruir (vector_binario_t* vec);

#endif //VECTOR_BINARIO_H
